Õppige Pythoniga looma võimsaid OLAP-süsteeme ja andmeladusid. Juhend katab andmemodelleerimise, ETL-i ning tööriistade (Pandas, Dask, DuckDB) valiku.
Pythoni andmeaidad: põhjalik juhend OLAP-süsteemide projekteerimiseks
Tänapäeva andmepõhises maailmas ei ole tohutute infohulkade kiire analüüsimise võime pelgalt konkurentsieelis; see on hädavajadus. Ettevõtted üle maailma tuginevad tugevale analüüsile, et mõista turusuundumusi, optimeerida tegevust ja teha strateegilisi otsuseid. Selle analüütilise võimekuse keskmes on kaks põhimõistet: the Andmeladu (DWH) ja Reaalaja Analüütilise Töötlemise (OLAP) süsteemid.
Traditsiooniliselt nõudis nende süsteemide ehitamine spetsiaalset, sageli patenteeritud ja kallist tarkvara. Kuid avatud lähtekoodiga tehnoloogiate esilekerkimine on andmetehnika demokratiseerinud. Seda arengut juhib Python, mitmekülgne ja võimas programmeerimiskeel rikkaliku ökosüsteemiga, mis teeb sellest erakordse valiku terviklike andmelahenduste loomiseks. Käesolev juhend pakub põhjalikku ülevaadet andmeladude ja OLAP-süsteemide projekteerimisest ja juurutamisest Pythoni ökosüsteemi abil, olles suunatud andmetehnikute, arhitektide ja arendajate globaalsele auditooriumile.
1. osa: Ärianalüüsi nurgakivid – DWH ja OLAP
Enne Pythoni koodi süvenemist on oluline mõista arhitektuuriprintsiipe. Levinud viga on püüda analüüsida andmeid otse operatiivsetest andmebaasidest, mis võib viia halva jõudluse ja ebatäpsete tulemusteni. Just selle probleemi lahendamiseks loodi andmeaidad ja OLAP.
Mis on andmeladu (DWH)?
Andmeladu on tsentraliseeritud hoidla, mis salvestab integreeritud andmeid ühest või mitmest eraldiseisvast allikast. Selle peamine eesmärk on toetada ärianalüüsi (BI) tegevusi, eriti analüüsi ja aruandlust. Kujutage seda ette kui organisatsiooni ajalooliste andmete ühtset tõeallikat.
See on teravas vastuolus Reaalaja Tehingutöötluse (OLTP) andmebaasiga, mis toidab igapäevaseid rakendusi (nt e-kaubanduse ostukorvisüsteem või panga tehingute register). Siin on kiire võrdlus:
- Töökoormus: OLTP-süsteemid töötlevad suurt hulka väikeseid ja kiireid tehinguid (lugemised, sisestused, uuendused). DWH-d on optimeeritud väiksema hulga komplekssete, pikalt kestvate päringute jaoks, mis skaneerivad miljoneid kirjeid (lugemismahulised).
- Andmestruktuur: OLTP-andmebaasid on andmete terviklikkuse tagamiseks ja üleliigsuse vältimiseks kõrgelt normaliseeritud. DWH-d on sageli denormaliseeritud analüütiliste päringute lihtsustamiseks ja kiirendamiseks.
- Eesmärk: OLTP on äritegevuse juhtimiseks. DWH on äritegevuse analüüsimiseks.
Hästi projekteeritud DWH-d iseloomustavad neli põhiomadust, mida sageli omistatakse teerajajale Bill Inmonile:
- Objektikeskne: Andmed on organiseeritud äritegevuse peamiste teemade, nagu 'Klient', 'Toode' või 'Müük', ümber, mitte rakendusprotsesside järgi.
- Integreeritud: Andmed kogutakse erinevatest allikatest ja integreeritakse ühtsesse vormingusse. Näiteks 'USA', 'United States' ja 'U.S.' võidakse kõik standardiseerida üheks 'United States' kirjeteks.
- Aja suhtes muutuv: Andmelaos olevad andmed esindavad infot pika aja jooksul (nt 5-10 aastat), võimaldades ajaloolist analüüsi ja trendide tuvastamist.
- Mittepüsiv: Kui andmed on kord lattu laaditud, uuendatakse või kustutatakse neid harva, kui üldse. Neist saab püsiv ajalooliste sündmuste register.
Mis on OLAP (Online Analytical Processing)?
Kui DWH on ajalooliste andmete raamatukogu, siis OLAP on võimas otsingumootor ja analüütiline tööriist, mis lets teid seda uurida. OLAP on tarkvaratehnoloogia kategooria, mis võimaldab kasutajatel kiiresti analüüsida teavet, mis on kokku võetud mitmemõõtmelistesse vaadetesse, mida tuntakse OLAP-kuupidena.
OLAP-kuup on OLAP-i kontseptuaalne süda. See ei ole tingimata füüsiline andmestruktuur, vaid viis andmete modelleerimiseks ja visualiseerimiseks. Kuup koosneb:
- Mõõdikud (Measures): Need on kvantitatiivsed, numbrilised andmepunktid, mida soovite analüüsida, nagu 'Tulu', 'Müüdud kogus' või 'Kasum'.
- Dimensioonid (Dimensions): Need on kategoorilised atribuudid, mis kirjeldavad mõõdikuid, pakkudes konteksti. Levinud dimensioonid hõlmavad 'Aega' (Aasta, Kvartal, Kuu), 'Geograafiat' (Riik, Piirkond, Linn) ja 'Toodet' (Kategooria, Bränd, SKU).
Kujutage ette müügiandmete kuupi. Saaksite vaadata kogu tulu (mõõdik) erinevate dimensioonide lõikes. OLAP-i abil saate sellel kuubil uskumatult kiiresti võimsaid operatsioone sooritada:
- Lõikamine (Slice): Kuubi dimensioonilisuse vähendamine, valides ühe dimensiooni jaoks ühe väärtuse. Näide: Müügiandmete vaatamine ainult 'Q4 2023' jaoks.
- Kuubiku lõikamine (Dice): Alam-kuubi valimine, määrates mitme dimensiooni jaoks väärtuste vahemiku. Näide: Müügi vaatamine 'Elektroonika' ja 'Rõivaste' (Tootedimensioon) jaoks 'Euroopas' ja 'Aasias' (Geograafia dimensioon).
- Allapoole puurimine / Ülespoole veeremine (Drill-Down / Drill-Up): Navigeerimine dimensiooni detaili tasandite vahel. Allapoole puurimine liigub kõrgema taseme kokkuvõtetest madalama taseme detailidesse (nt 'Aastast' 'Kvartalisse' 'Kuusse'). Ülespoole veeremine on vastupidine.
- Pööramine (Pivot): Kuubi telgede pööramine, et saada uus andmevaade. Näide: 'Toote' ja 'Geograafia' telgede vahetamine, et näha, millised piirkonnad ostavad milliseid tooteid, selle asemel, et milliseid tooteid millistes piirkondades müüakse.
OLAP-süsteemide tüübid
OLAP-süsteemide jaoks on kolm peamist arhitektuurimudelit:
- MOLAP (Multidimensionaalne OLAP): See on "klassikaline" kuubimudel. Andmed eraldatakse DWH-st ja agregeeritakse eelnevalt patenteeritud, mitmemõõtmelisse andmebaasi. Plussid: Äärmiselt kiire päringu jõudlus, sest kõik vastused on eelarvutatud. Miinused: Võib põhjustada "andmeplahvatuse", kuna eelagregeeritud lahtrite arv võib muutuda tohutuks, ja see võib olla vähem paindlik, kui on vaja küsida küsimust, mida ei olnud ette nähtud.
- ROLAP (Relatsiooniline OLAP): See mudel hoiab andmeid relatsioonilises andmebaasis (tavaliselt DWH ise) ja kasutab keerukat metaandmete kihti OLAP-päringute tõlkimiseks standardseks SQL-iks. Plussid: Väga skaleeritav, kuna see kasutab ära kaasaegsete relatsiooniliste andmebaaside võimsust ja suudab päringuid teha detailsemate, reaalajas andmete kohta. Miinused: Päringu jõudlus võib olla aeglasem kui MOLAP-il, kuna agregeerimised tehakse lennult.
- HOLAP (Hübriid OLAP): See lähenemine püüab kombineerida mõlema maailma parimaid omadusi. See salvestab kõrgetasemelised agregeeritud andmed MOLAP-stiilis kuupi kiiruse tagamiseks ja hoiab detailseid andmeid ROLAP-i relatsioonilises andmebaasis allapoole puurimise analüüsi jaoks.
Pythoniga loodud kaasaegsete andmevirnade puhul on piirid hägustunud. Uskumatult kiirete kolonnipõhiste andmebaaside esilekerkimisega on ROLAP-mudel muutunud domineerivaks ja väga tõhusaks, pakkudes sageli jõudlust, mis konkureerib traditsiooniliste MOLAP-süsteemidega ilma jäikuseta.
2. osa: Pythoni ökosüsteem andmeladustamiseks
Miks valida Python ülesande jaoks, mida traditsiooniliselt domineerivad ettevõtte BI-platvormid? Vastus peitub selle paindlikkuses, võimsas ökosüsteemis ja võimes ühendada kogu andmete elutsükkel.
Miks Python?
- Ühtne keel: Pythonit saab kasutada andmete ekstraheerimiseks (ETL), teisendamiseks, laadimiseks, orkestreerimiseks, analüüsiks, masinõppeks ja API arenduseks. See vähendab keerukust ja vajadust konteksti vahetamiseks erinevate keelte ja tööriistade vahel.
- Suur teegisüsteem: Pythonil on küpsed, testitud teegid protsessi igaks etapiks, alates andmete manipuleerimisest (Pandas, Dask) kuni andmebaasidega suhtlemiseni (SQLAlchemy) ja töövoogude haldamiseni (Airflow, Prefect).
- Tarnijast sõltumatu: Python on avatud lähtekoodiga ja ühendub kõigega. Olenemata sellest, kas teie andmed asuvad PostgreSQL-i andmebaasis, Snowflake'i laos, S3 andmejärves või Google Sheetis, on olemas Pythoni teek nendele juurdepääsemiseks.
- Skaleeritavus: Pythoni lahendused saavad skaleeruda lihtsast sülearvutil töötavast skriptist kuni hajutatud süsteemini, mis töötleb petabaite andmeid pilveklastris, kasutades tööriistu nagu Dask või Spark (PySparki kaudu).
Pythoni põhiteegid andmelao virna jaoks
Tavaline Pythonil põhinev andmelao lahendus ei ole üks toode, vaid kureeritud kogum võimsaid teeke. Siin on põhilised:
ETL/ELT jaoks (Extract, Transform, Load)
- Pandas: De facto standard Pythoni siseseks andmete manipuleerimiseks. Ideaalne väikeste ja keskmise suurusega andmehulkade (kuni mitu gigabaiti) käsitlemiseks. Selle DataFrame'i objekt on intuitiivne ja võimas andmete puhastamiseks, teisendamiseks ja analüüsimiseks.
- Dask: Paralleelarvutuste teek, mis skaleerib teie Pythoni analüütikat. Dask pakub paralleelset DataFrame'i objekti, mis jäljendab Pandase API-d, kuid suudab töötada mälu mahust suuremate andmehulkadega, jagades need tükkideks ja töödeldes neid paralleelselt mitme südamiku või masina vahel.
- SQLAlchemy: Peamine SQL-i tööriistakomplekt ja objektrelaatsioooniline mapper (ORM) Pythoni jaoks. See pakub ühtset, kõrgetasemelist API-d ühenduse loomiseks praktiliselt iga SQL-andmebaasiga, alates SQLite'ist kuni ettevõttetaseme andmeladudeni nagu BigQuery või Redshift.
- Töövoogude orkestreerijad (Airflow, Prefect, Dagster): Andmeladu ei ehitata ühe skripti peale. See on rida sõltuvaid ülesandeid (ekstraheerimine A-st, teisendamine B-st, laadimine C-sse, kontrollimine D-d). Orkestreerijad võimaldavad teil määratleda need tööülesanded suunatud atsiikiliste graafidena (DAG-id), ajastades, jälgides ja uuesti proovides neid tugevalt.
Andmete salvestamiseks ja töötlemiseks
- Pilve-DWH-konnektorid: Teegid nagu
snowflake-connector-python,google-cloud-bigqueryjapsycopg2(Redshifti ja PostgreSQL-i jaoks) võimaldavad sujuvat suhtlust peamiste pilveandmeladudega. - PyArrow: Kriitiline teek kolonnipõhiste andmevormingutega töötamiseks. See pakub standardiseeritud mälusisese vormingu ja võimaldab süsteemide vahel kiiret andmeedastust. See on tõhusa interaktsiooni mootor selliste vormingutega nagu Parquet.
- Kaasaegsed järvelao teegid (Lakehouse Libraries): Täiustatud seadistuste jaoks võimaldavad teegid nagu
deltalake,py-icebergja – Sparki kasutajatele – PySparki natiivne tugi nende vormingute jaoks Pythonil luua usaldusväärseid, tehingupõhiseid andmejärvi, mis toimivad andmelao alusena.
3. osa: OLAP-süsteemi projekteerimine Pythoniga
Nüüd liigume teooriast praktikasse. Siin on samm-sammult juhend oma analüütilise süsteemi projekteerimiseks.
1. samm: Andmemodelleerimine analüütika jaoks
Iga hea OLAP-süsteemi alus on selle andmemudel. Eesmärk on struktureerida andmed kiireks ja intuitiivseks päringute tegemiseks. Kõige levinumad ja tõhusamad mudelid on tähtskeem ja selle variant, lumehelbe skeem.
Tähtskeem vs. Lumehelbe skeem
Tähtskeem on andmeladude jaoks kõige laialdasemalt kasutatav struktuur. See koosneb:
- Kesksest faktitabelist (Fact Table): sisaldab mõõdikuid (numbrid, mida soovite analüüsida) ja võõrvõtmeid dimensioonitabelitele.
- Mitmetest dimensioonitabelitest (Dimension Tables): Iga dimensioonitabel on ühendatud faktitabeliga ühe võtme abil ja sisaldab kirjeldavaid atribuute. Need tabelid on lihtsuse ja kiiruse huvides kõrgelt denormaliseeritud.
Näide: Tabel `FactSales` veergudega nagu `DateKey`, `ProductKey`, `StoreKey`, `QuantitySold` ja `TotalRevenue`. Seda ümbritseksid tabelid `DimDate`, `DimProduct` ja `DimStore`.
Lumehelbe skeem on tähtskeemi laiendus, kus dimensioonitabelid on normaliseeritud mitmeks seotud tabeliks. Näiteks tabel `DimProduct` võidakse jaotada tabeliteks `DimProduct`, `DimBrand` ja `DimCategory`.
Soovitus: Alustage tähtskeemiga. Päringud on lihtsamad (vähem ühendusi) ja kaasaegsed kolonnipõhised andmebaasid on nii tõhusad laiade, denormaliseeritud tabelite käsitlemisel, et lumehelbe skeemide salvestusruumi eelised on sageli tühised võrreldes täiendavate ühenduste jõudluskuluga.
2. samm: ETL/ELT-torujuhtme ehitamine Pythonis
ETL-protsess on selgroog, mis toidab teie andmeladu. See hõlmab andmete eraldamist lähtesüsteemidest, nende teisendamist puhtasse ja ühtsesse vormingusse ning laadimist teie analüüsimudelisse.
Illustreerime seda lihtsa Pythoni skriptiga, mis kasutab Pandast. Kujutage ette, et meil on toorandmete CSV-fail tellimuste kohta.
# A simplified ETL example using Python and Pandas
import pandas as pd
# --- EXTRACT ---
print("Toorandmete ekstraheerimine...")
source_df = pd.read_csv('raw_orders.csv')
# --- TRANSFORM ---
print("Andmete teisendamine...")
# 1. Andmete puhastamine
source_df['order_date'] = pd.to_datetime(source_df['order_date'])
source_df['product_price'] = pd.to_numeric(source_df['product_price'], errors='coerce')
source_df.dropna(inplace=True)
# 2. Andmete rikastamine - Loo eraldi kuupäeva dimensioon
dim_date = pd.DataFrame({
'DateKey': source_df['order_date'].dt.strftime('%Y%m%d').astype(int),
'Date': source_df['order_date'].dt.date,
'Year': source_df['order_date'].dt.year,
'Quarter': source_df['order_date'].dt.quarter,
'Month': source_df['order_date'].dt.month,
'DayOfWeek': source_df['order_date'].dt.day_name()
}).drop_duplicates().reset_index(drop=True)
# 3. Loo toote dimensioon
dim_product = source_df[['product_id', 'product_name', 'category']].copy()
dim_product.rename(columns={'product_id': 'ProductKey'}, inplace=True)
dim_product.drop_duplicates(inplace=True).reset_index(drop=True)
# 4. Loo faktitabel
fact_sales = source_df.merge(dim_date, left_on=source_df['order_date'].dt.date, right_on='Date')\
.merge(dim_product, left_on='product_id', right_on='ProductKey')
fact_sales = fact_sales[['DateKey', 'ProductKey', 'order_id', 'quantity', 'product_price']]
fact_sales['TotalRevenue'] = fact_sales['quantity'] * fact_sales['product_price']
fact_sales.rename(columns={'order_id': 'OrderCount'}, inplace=True)
# Agregeerimine soovitud detailsusastmeni
fact_sales = fact_sales.groupby(['DateKey', 'ProductKey']).agg(
TotalRevenue=('TotalRevenue', 'sum'),
TotalQuantity=('quantity', 'sum')
).reset_index()
# --- LOAD ---
print("Andmete laadimine sihtmälu...")
# Selles näites salvestame Parquet-failidesse, mis on väga tõhus kolonnipõhine vorming
dim_date.to_parquet('warehouse/dim_date.parquet')
dim_product.to_parquet('warehouse/dim_product.parquet')
fact_sales.to_parquet('warehouse/fact_sales.parquet')
print("ETL-protsess lõpetatud!")
See lihtne skript demonstreerib põhilist loogikat. Reaalses stsenaariumis pakendaksite selle loogika funktsioonidesse ja haldaksite selle täitmist orkestreerijaga nagu Airflow.
3. samm: OLAP-mootori valimine ja juurutamine
Kui teie andmed on modelleeritud ja laaditud, vajate mootorit OLAP-operatsioonide sooritamiseks. Pythoni maailmas on teil mitu võimsat valikut, mis järgivad peamiselt ROLAP-i lähenemist.
Lähenemine A: Kergekaaluline jõuallikas – DuckDB
DuckDB on protsessisisene analüütiline andmebaas, mis on Pythoniga uskumatult kiire ja lihtne kasutada. See suudab SQL-i abil otse päringuid teha Pandase DataFramidele või Parquet-failidele. See on ideaalne valik väikese ja keskmise suurusega OLAP-süsteemide, prototüüpide ja kohaliku arenduse jaoks.
See toimib suure jõudlusega ROLAP-mootorina. Te kirjutate standardse SQL-i ja DuckDB täidab selle äärmise kiirusega teie andmefailide kohal.
import duckdb
# Ühenda mälusisese andmebaasiga või failiga
con = duckdb.connect(database=':memory:', read_only=False)
# Päring otse Parquet-failidele, mille varem lõime
# DuckDB mõistab skeemi automaatselt
result = con.execute("""
SELECT
p.category,
d.Year,
SUM(f.TotalRevenue) AS AnnualRevenue
FROM 'warehouse/fact_sales.parquet' AS f
JOIN 'warehouse/dim_product.parquet' AS p ON f.ProductKey = p.ProductKey
JOIN 'warehouse/dim_date.parquet' AS d ON f.DateKey = d.DateKey
WHERE p.category = 'Electronics'
GROUP BY p.category, d.Year
ORDER BY d.Year;
""").fetchdf() # fetchdf() tagastab Pandas DataFrame'i
print(result)
Lähenemine B: Pilvemastaapsed titaanid – Snowflake, BigQuery, Redshift
Suuremahuliste ettevõttesüsteemide jaoks on pilveandmeladu standardvalik. Python integreerub nende platvormidega sujuvalt. Teie ETL-protsess laadiks andmed pilve DWH-sse ja teie Pythoni rakendus (nt BI-töölaud või Jupyteri märkmik) teeks sinna päringuid.
Loogika jääb samaks nagu DuckDB puhul, kuid ühendus ja skaala on erinevad.
import snowflake.connector
# Näide Snowflake'iga ühenduse loomisest ja päringu käivitamisest
conn = snowflake.connector.connect(
user='your_user',
password='your_password',
account='your_account_identifier'
)
cursor = conn.cursor()
try:
cursor.execute("USE WAREHOUSE MY_WH;")
cursor.execute("USE DATABASE MY_DB;")
cursor.execute("""
SELECT category, YEAR(date), SUM(total_revenue)
FROM fact_sales
JOIN dim_product ON ...
JOIN dim_date ON ...
GROUP BY 1, 2;
""")
# Tulemuste toomine vastavalt vajadusele
for row in cursor:
print(row)
finally:
cursor.close()
conn.close()
Lähenemine C: Reaalaja spetsialistid – Apache Druid või ClickHouse
Kasutusjuhtude puhul, mis nõuavad alamsekundilist päringu latentsust massiivsete, voogedastatavate andmehulkade puhul (nagu reaalajas kasutajaanalüüs), on spetsialiseeritud andmebaasid nagu Druid või ClickHouse suurepärased valikud. Need on OLAP-i töökoormuste jaoks loodud kolonnipõhised andmebaasid. Pythonit kasutatakse andmete neisse voogedastamiseks ja nende kohta päringute tegemiseks vastavate klienditeekide või HTTP API-de kaudu.
4. osa: Praktiline näide – mini-OLAP-süsteemi ehitamine
Ühendame need kontseptsioonid mini-projektiks: interaktiivne müügitöölaud. See demonstreerib terviklikku, ehkki lihtsustatud, Pythonil põhinevat OLAP-süsteemi.
Meie virn:
- ETL: Python ja Pandas
- Andmete salvestus: Parquet-failid
- OLAP-mootor: DuckDB
- Töölaud: Streamlit (avatud lähtekoodiga Pythoni teek ilusate, interaktiivsete veebirakenduste loomiseks andmeteaduse jaoks)
Kõigepealt käivitage 3. osas olev ETL-skript, et genereerida Parquet-failid kataloogi `warehouse/`.
Järgmisena looge töölaua rakenduse fail `app.py`:
# app.py - Lihtne interaktiivne müügitöölaud
import streamlit as st
import duckdb
import pandas as pd
import plotly.express as px
# --- Lehekülje konfiguratsioon ---
st.set_page_config(layout="wide", page_title="Globaalne müügitöölaud")
st.title("Interaktiivne müügi OLAP-töölaud")
# --- Ühendus DuckDB-ga ---
# See teeb päringuid otse meie Parquet-failidele
con = duckdb.connect(database=':memory:', read_only=True)
# --- Dimensiooniandmete laadimine filtrite jaoks ---
@st.cache_data
def load_dimensions():
products = con.execute("SELECT DISTINCT category FROM 'warehouse/dim_product.parquet'").fetchdf()
years = con.execute("SELECT DISTINCT Year FROM 'warehouse/dim_date.parquet' ORDER BY Year").fetchdf()
return products['category'].tolist(), years['Year'].tolist()
categories, years = load_dimensions()
# --- Külgriba filtrite jaoks (lõikamine ja tükeldamine!) ---
st.sidebar.header("OLAP-filtrid")
selected_categories = st.sidebar.multiselect(
'Vali tootekategooriad',
options=categories,
default=categories
)
selected_year = st.sidebar.selectbox(
'Vali aasta',
options=years,
index=len(years)-1 # Vaikeväärtusena viimane aasta
)
# --- Koosta OLAP-päring dünaamiliselt ---
if not selected_categories:
st.warning("Palun valige vähemalt üks kategooria.")
st.stop()
query = f"""
SELECT
d.Month,
d.MonthName, -- Eeldusel, et MonthName eksisteerib DimDate'is
p.category,
SUM(f.TotalRevenue) AS Revenue
FROM 'warehouse/fact_sales.parquet' AS f
JOIN 'warehouse/dim_product.parquet' AS p ON f.ProductKey = p.ProductKey
JOIN 'warehouse/dim_date.parquet' AS d ON f.DateKey = d.DateKey
WHERE d.Year = {selected_year}
AND p.category IN ({str(selected_categories)[1:-1]})
GROUP BY d.Month, d.MonthName, p.category
ORDER BY d.Month;
"""
# --- Käivita päring ja kuva tulemused ---
@st.cache_data
def run_query(_query):
return con.execute(_query).fetchdf()
results_df = run_query(query)
if results_df.empty:
st.info(f"Valitud filtritega aasta {selected_year} kohta andmeid ei leitud.")
else:
# --- Peamised töölaua visuaalid ---
col1, col2 = st.columns(2)
with col1:
st.subheader(f"Kuu tulu aastal {selected_year}")
fig = px.line(
results_df,
x='MonthName',
y='Revenue',
color='category',
title='Kuu tulu kategooria järgi'
)
st.plotly_chart(fig, use_container_width=True)
with col2:
st.subheader("Tulu kategooria järgi")
category_summary = results_df.groupby('category')['Revenue'].sum().reset_index()
fig_pie = px.pie(
category_summary,
names='category',
values='Revenue',
title='Kogutulu osakaal kategooria järgi'
)
st.plotly_chart(fig_pie, use_container_width=True)
st.subheader("Detailne info")
st.dataframe(results_df)
Selle käivitamiseks salvestage kood `app.py` nime all ja käivitage terminalis `streamlit run app.py`. See avab veebilehitseja koos teie interaktiivse töölauaga. Külgribal olevad filtrid võimaldavad kasutajatel sooritada OLAP-i "lõikamis- ja tükeldamisoperatsioone ning töölaud uuendab ennast reaalajas, tehes korduvalt päringuid DuckDB-le.
5. osa: Täiustatud teemad ja parimad praktikad
Miniprojektist tootmissüsteemile üleminekul kaaluge neid täiustatud teemasid.
Skaleeritavus ja jõudlus
- Kasutage Daski suurte ETL-tööde jaoks: Kui teie lähteandmed ületavad teie masina RAM-i, asendage Pandas Daskiga oma ETL-skriptides. API on väga sarnane, kuid Dask käsitleb välise ja paralleelse töötlemise.
- Kolonnipõhine salvestus on võtmetähtsusega: Salvestage oma andmelaofailid alati kolonnipõhises vormingus, nagu Apache Parquet või ORC. See kiirendab dramaatiliselt analüütilisi päringuid, mis tavaliselt vajavad vaid mõne veeru lugemist laialt tabelist.
- Partitsioneerimine: Andmete salvestamisel andmejärves (nagu S3 või kohalik failisüsteem), partitsioneerige oma andmed kaustadesse vastavalt sageli filtreeritud dimensioonile, näiteks kuupäevale. Näiteks: `warehouse/fact_sales/year=2023/month=12/`. See võimaldab päringumootoritel vahele jätta ebaoluliste andmete lugemise, protsessi, mida tuntakse kui "partitsiooni kärpimist".
Semantiline kiht
Süsteemi kasvades leiate, et äri loogikat (nagu "Aktiivne Kasutaja" või "Brutokasumi" definitsioon) korratakse mitmetes päringutes ja armatuurlaudades. Semantiline kiht lahendab selle, pakkudes teie ärimõõdikute ja dimensioonide tsentraliseeritud ja järjepidevat definitsiooni. Tööriistad nagu dbt (Data Build Tool) on selleks erakordsed. Kuigi dbt ei ole iseenesest Pythoni tööriist, integreerub see suurepäraselt Pythoniga orkestreeritud töövooga. dbt-d kasutatakse teie tähtskeemi modelleerimiseks ja mõõdikute määratlemiseks ning seejärel saab Pythonit kasutada dbt käivituste orkestreerimiseks ja tulemuslike puhtade tabelite täpsema analüüsi tegemiseks.
Andmehalduse ja kvaliteet
Ladu on ainult nii hea kui selles olevad andmed. Integreerige andmete kvaliteedikontrollid otse oma Pythoni ETL-torujuhtmetesse. Teegid nagu Great Expectations võimaldavad teil määratleda andmete kohta "ootusi" (nt `customer_id` ei tohi kunagi olla null, `revenue` peab olema vahemikus 0 kuni 1 000 000). Teie ETL-töö võib seejärel ebaõnnestuda või teid teavitada, kui sisenevad andmed rikuvad neid lepinguid, vältides halbade andmete rikkumist teie laos.
Järeldus: Koodikeskse lähenemise võimsus
Python on põhimõtteliselt muutnud andmeladustamise ja ärianalüüsi maastikku. See pakub paindlikku, võimsat ja tarnijast sõltumatut tööriistakomplekti keerukate analüütiliste süsteemide nullist ehitamiseks. Kombineerides parimaid teeke, nagu Pandas, Dask, SQLAlchemy ja DuckDB, saate luua tervikliku OLAP-süsteemi, mis on nii skaleeritav kui ka hooldatav.
Teekond algab andmemodelleerimise põhimõtete, näiteks tähtskeemi, kindlast mõistmisest. Sealt edasi saate luua tugevaid ETL-torujuhtmeid oma andmete kujundamiseks, valida oma mastaabi jaoks sobiva päringumootori ja isegi luua interaktiivseid analüütilisi rakendusi. See koodikeskne lähenemine, mis on sageli "kaasaegse andmevirna" põhitõde, annab analüütika võimsuse otse arendajate ja andme meeskondade kätte, võimaldades neil ehitada süsteeme, mis on täielikult kohandatud nende organisatsiooni vajadustele.